home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / fapxtool / src / txm / txmforum.c < prev    next >
C/C++ Source or Header  |  1995-01-06  |  4KB  |  180 lines

  1. /***************
  2. *
  3. * txm\txmforum.c
  4. */
  5. #include "txm.h"
  6.  
  7. /*
  8.                  ┌→WRK(workfile) →rename LOG(logfile)
  9.   LOG(logfile) →┤
  10.                  └→001,...(mfile)
  11. */
  12.  
  13. /* マージファイル更新チェック/必要ならマージファイルを新しくする/情報ファイル更新(フォーラム/HP用) */
  14. int fchknewmerge(char *buf1, char *buf2, FILE **fp)
  15. {
  16.     long article;                /* 発言番号 */
  17.     union _LONG ltime;
  18.     int year = 0, month = 0, day = 0, hour = 0, minute = 0;
  19.     unsigned short ym = 0, dhm = 0;
  20.     int newflag = FALSE;
  21.     char ext[6];
  22.  
  23.     article = atol(buf1);
  24.     sscanf(buf2, "%2d/%2d/%2d %2d:%2d",
  25.             &year, &month, &day, &hour, &minute);
  26.     ym = (year << 4) | month;
  27.     dhm = (day << 11) | (hour << 6) | minute;
  28.     ltime.s.h = ym;
  29.     ltime.s.l = dhm;
  30.  
  31.     switch (nextmerge) {
  32.     case 0:
  33.         if (filelength(fileno(*fp)) >= nextvalue) {
  34.             newflag = TRUE;
  35.         }
  36.         break;
  37.     case 1:
  38.         if (nextvalue == 1) {
  39.             if (nowinfo->art > article) {
  40.                 newflag = TRUE;
  41.             }
  42.         }
  43.         else if ((article % nextvalue) == 1) {
  44.             newflag = TRUE;
  45.         }
  46.         break;
  47.     case 2:
  48.         if (nowinfo->ltime.s.h != 0) {
  49.             if (nowinfo->ltime.s.h < ym) {
  50.                 newflag = TRUE;
  51.             }
  52.         }
  53.         break;
  54.     }
  55.  
  56.     if (nowinfo->ltime.x > ltime.x) {
  57.         newflag = FALSE;
  58.     }
  59.     else {
  60.         nowinfo->ltime.x = ltime.x;
  61.     }
  62.  
  63.     if (nowinfo->art == 0) {
  64.         newflag = FALSE;
  65.     }
  66.  
  67.     nowinfo->art = (unsigned short)article;
  68.  
  69.     if (newflag) {
  70.         fclose(*fp);
  71.         nowinfo->ext += 1;
  72.         sprintf(ext, ".%03d", nowinfo->ext);
  73.         makenewextname(logfile, mfile, ext);
  74.         if ((*fp = fopen(mfile, "wb")) == NULL) {
  75.             return ERROR;
  76.         }
  77.         fputs(head1, *fp);
  78.         fputs(head2, *fp);
  79.         fputs(mesname, *fp);
  80.     }
  81.     else {
  82.         return FALSE;
  83.     }
  84.     return TRUE;
  85. }
  86.  
  87. /* フォラーム/パティオマージ */
  88. int  forummerge()
  89. {
  90.     FILE *fr, *fw, *fm;
  91.     int ret, mesnameflg = FALSE;
  92.     long nowsize, limitsize;
  93.     char *vbuf;
  94.  
  95. /*    printf("forummerge()\n");    */
  96.     if ((fr = fopen(logfile, "rb")) == NULL) {
  97.         return FALSE;
  98.     }
  99.     /* setvbufのmallocは取りっ放し(終了時の自動開放??) */
  100.     setvbuf(fr, malloc(VBUFSIZE), _IOFBF, VBUFSIZE);
  101.  
  102.     if ((fm = fopen(mfile, "ab")) == NULL) {
  103.         fclose(fr);
  104.         return FALSE;
  105.     }
  106.     /* setvbufのmallocは取りっ放し(終了時の自動開放??) */
  107.     setvbuf(fm, vbuf = malloc(VBUFSIZE), _IOFBF, VBUFSIZE);
  108.  
  109.     fgets(head1, 80, fr);    /* ヘッダ読み込み */
  110.     fgets(head2, 80, fr);    /* ヘッダ読み込み */
  111.  
  112.     if (filelength(fileno(fm)) == 0) {
  113.         fputs(head1, fm);
  114.         fputs(head2, fm);
  115.         mesnameflg = TRUE;
  116.     }
  117.  
  118.     limitsize = (long)minrun * 1024;
  119.     nowsize = filelength(fileno(fr));
  120.     nowsize -= strlen(head1);
  121.     nowsize -= strlen(head2);
  122.  
  123.     while (nowsize > limitsize) {
  124.         if (fgets(line1, 100, fr) == NULL) {
  125.             break;
  126.         }
  127.         nowsize -= strlen(line1);
  128.         if (*line1 == '-') {
  129.             strcpy(mesname, line1);
  130.             if (mesnameflg) {
  131.                 fputs(mesname, fm);
  132.                 mesnameflg = FALSE;
  133.             }
  134.         }
  135.         else if (matchstr(log_mes1, line1) || matchstr(log_mes2, line1)) {
  136.             if (fgets(line2, 100, fr) == NULL) {
  137.                 break;
  138.             }
  139.             nowsize -= strlen(line2);
  140.             if (ret = fchknewmerge(line1, line2+7, &fm)) {
  141.                 if (ret == ERROR) {
  142.                     fclose(fr);
  143.                     return FALSE;
  144.                 }
  145.             }
  146.             fputs(line1, fm);
  147.             fputs(line2, fm);
  148.             for(;;) {    /* デリミタまで発言転送 */
  149.                 if (fgets(line1, 82, fr) == NULL) {
  150.                     break;
  151.                 }
  152.                 nowsize -= strlen(line1);
  153.                 if (*((long *)line1) == 0x0a0d0820) { /* デリミタ(リトルエンディアン用) */
  154.                     fputs("\r\n", fm);
  155.                     break;
  156.                 }
  157.                 fputs(line1, fm);
  158.             }
  159.         }
  160.     }
  161.     fclose(fm);
  162.  
  163.     if ((fw = fopen(workfile, "wb")) == NULL) {
  164.         fclose(fr);
  165.         return FALSE;
  166.     }
  167.     setvbuf(fw, vbuf, _IOFBF, VBUFSIZE);
  168.     fputs(head1, fw);
  169.     fputs(head2, fw);
  170.     fputs(mesname, fw);
  171.     while (fgets(line1, 82, fr)) {
  172.         fputs(line1, fw);
  173.     }
  174.     fclose(fr);
  175.     fclose(fw);
  176.  
  177.     return TRUE;
  178. }
  179.  
  180.